#pragma once
#include <string>
#include <vector>

class BigInteger
  {
  public:
    BigInteger();
    BigInteger(const BigInteger& other);
    BigInteger(BigInteger&& other);
    BigInteger(long long int i_init);
    explicit BigInteger(const std::string& i_init);
    ~BigInteger();

    operator std::string();

    BigInteger& operator = (const BigInteger& other);

    BigInteger& operator ++ ();
    BigInteger operator ++ (int);

    BigInteger& operator -- ();
    BigInteger operator -- (int);

    BigInteger operator + () const;
    BigInteger operator - () const;

    BigInteger operator + (const BigInteger& other) const;
    BigInteger operator - (const BigInteger& other) const;
    BigInteger operator * (const BigInteger& other) const;
    BigInteger operator / (const BigInteger& other) const;
    BigInteger operator % (const BigInteger& other) const;

    BigInteger& operator += (const BigInteger& other);
    BigInteger& operator -= (const BigInteger& other);
    BigInteger& operator *= (const BigInteger& other);
    BigInteger& operator /= (const BigInteger& other);
    BigInteger& operator %= (const BigInteger& other);

    bool operator < (const BigInteger& other) const;
    bool operator <= (const BigInteger& other) const;

    bool operator > (const BigInteger& other) const;
    bool operator >= (const BigInteger& other) const;

    bool operator == (const BigInteger& other) const;
    bool operator != (const BigInteger& other) const;

  private:
    std::vector<int> m_data;
    const int m_base;
  };

